#ifndef _H_DIVA_KEYFRAME_H_
#define _H_DIVA_KEYFRAME_H_

#include <map>
#include <vector>
#include "DIVA_VM.h"
#include "KeyFrameObj.h"
#include "WOPInvokedObj.h"
#include "LyInvokedObj.h"
#include "ScopeInvokedObj.h"
#include "VMStatus.h"
#include "xMappingTree.h"

using namespace std;

typedef map<DIVA_VM*,VMStatus*> VMStatusTable;
typedef map<WOPInvokedObj*,xMappingTree> ProxyWOPTable;
class DIVA_KeyFrame{
private:
	vector<WOPInvokedObj*> _all_wops;
	vector<LyInvokedObj*> _all_ly_objs;
	vector<ScopeInvokedObj*> _all_scope_obj;
	ProxyWOPTable _proxy_wop_xmt_table;
	VMStatusTable _vms_status_table;
	bool checkVMisExisted(DIVA_VM*);
	void setupVMStatusTable(vector<DIVA_VM*>);
	void triggerProxyWOPValueUpdate();
	
public:
	DIVA_KeyFrame();
	vector<WOPInvokedObj*> getWOPKeyFrameObjects(){
		return this->_all_wops;
	}
	vector<LyInvokedObj*> getLyKeyFrameObjects(){
		return this->_all_ly_objs;
	}
	vector<ScopeInvokedObj*> getScopeKeyFrameObjects(){
		return this->_all_scope_obj;
	}
	VMStatus* getVMStatus(DIVA_VM*);
	VMStatusTable getVMStatusTable(){
		return _vms_status_table;
	}
	void addNewScopeInvokedObj(ScopeInvokedObj*);
	void addNewLyInvokedObj(LyInvokedObj*);	
	void recover();
	void render(float);
	void recoverVM();
	void restartVM();
	//void pruneWOPObjisOutOfScope(vector<WOPInvokedObj*>);
	void exploreVM();
	~DIVA_KeyFrame();
};
#endif